package com.teng.mylibrary.util.update

import android.app.Application
import android.content.Context
import android.os.Build
import android.util.Log
import com.google.gson.Gson
import com.xuexiang.xupdate.XUpdate
import com.xuexiang.xupdate.utils.UpdateUtils
import com.xuexiang.xupdate.entity.UpdateEntity
import com.xuexiang.xupdate.listener.IUpdateParseCallback

import com.xuexiang.xupdate.proxy.IUpdateParser
import com.teng.mylibrary.R
import com.teng.mylibrary.util.ToastHelper


/**
 * Description:  软件更新工具类
 * Author:       liuteng
 * CreateDate:   2021/12/17 13:38
 * UpdateRemark: 更新说明
 */
object UpdateAppUtil {

    var callback: UpdateCallback? = null

    /**
     * 检测版本更新
     * @param updateApi String  检测接口地址url
     */
    fun checkUpdate(context: Context, callback: UpdateCallback?, mUpdateUrl: String) {
        this.callback = callback
        XUpdate.newBuild(context)
            .updateUrl(mUpdateUrl)
            .promptThemeColor(context.resources.getColor(R.color.blue))
            .promptTopResId(R.mipmap.xupdate_bg_app_top)
            .updateParser(CustomUpdateParser(context)) //设置自定义的版本更新解析器
            .update()
    }

    /**
     * Application里初始化
     */
    fun initUpdateConfig(application: Application) {
        XUpdate.get()
            .isWifiOnly(false) //默认设置只在wifi下检查版本更新
            .isGet(true) //默认设置使用get请求检查版本
            .isAutoMode(false) //默认设置非自动模式，可根据具体使用配置
            .param("VersionCode", UpdateUtils.getVersionCode(application)) //设置默认公共请求参数
            .param("AppName", UpdateUtils.getAppName(application)) //设置默认公共请求参数
            .setILogger { priority, tag, message, t ->
                Log.e(tag, message)
            }
            .setOnUpdateFailureListener { error ->
                //设置版本更新出错的监听
                callback?.onUpdateResponse(error.toString())
                ToastHelper.showOther(application, error.toString())
            }
            .setIUpdateHttpService(OKHttpUpdateHttpService()) //这个必须设置！实现网络请求功能。
            .init(application) //这个必须初始化

    }

    private class CustomUpdateParser(val context: Context) : IUpdateParser {

        override fun parseJson(json: String): UpdateEntity {
            Log.d("UpdateAppUtil", json)
            val result = Gson().fromJson(json, AppVersionInfo::class.java)
            val versionCode = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
                context.packageManager.getPackageInfo(
                    context.packageName,
                    0
                ).longVersionCode.toInt()
            } else {
                context.packageManager.getPackageInfo(context.packageName, 0).versionCode
            }
            return UpdateEntity()
                .setVersionCode(result.versionCode)
                .setVersionName(result.versionName)
                .setHasUpdate(result.versionCode > versionCode)
                .setUpdateContent(result.updateContent)
                .setDownloadUrl(result.path)
        }

        override fun parseJson(json: String?, callback: IUpdateParseCallback?) {
        }

        override fun isAsyncParser(): Boolean {
            return false
        }
    }

    interface UpdateCallback {
        fun onUpdateResponse(msg: String)
    }

}